//package com.pro.common.service.pay.third.clickpay;
//
//import cn.hutool.core.lang.Console;
//import cn.hutool.core.map.MapBuilder;
//import cn.hutool.http.ContentType;
//import cn.hutool.json.JSONObject;
//import com.pro.common.service.pay.controller.PayCommonController;
//import com.pro.common.api.pay.model.db.PayMerchant;
//import com.pro.common.service.pay.model.dto.NotifyIO;
//import com.pro.common.service.pay.model.dto.PayoutIO;
//import com.pro.common.service.pay.model.dto.PayoutNotifyIO;
//import com.pro.common.service.pay.model.dto.UnifiedOrderIO;
//import com.pro.common.service.pay.service.PayMerchantService;
//import com.pro.common.service.pay.util.SignatureUtil;
//import com.pro.framework.api.util.LogicUtils;
//import com.pro.framework.api.util.StrUtils;
//import io.swagger.v3.oas.annotations.tags.Tag;
//import jakarta.servlet.http.HttpServletRequest;
//import lombok.Getter;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RestController;
//
//import java.math.RoundingMode;
//import java.util.ArrayList;
//import java.util.Collections;
//import java.util.List;
//import java.util.Map;
//
//
//@Slf4j
//@Getter
//@RestController
//@Tag(name = "clickpay支付")
//@RequestMapping("pay/clickpay/{MER_CODE}")
//public class ClickPayController extends PayCommonController {
//    private static final String MAIL = "click@gmail.com";
//    private static final String BANK_NAME = "Bank Name";
//    private static final String PHONE = "10000000";
//
//    //通道编号
//    private final String merCode = "CLICKPAY";
//
//    // 使用率 JSON > FORM_URLENCODED (表单)
//    private final ContentType postContentType = ContentType.JSON;
//
//    @Autowired
//    private PayMerchantService merchantService;
//
//
//    @Override
//    //代收下单签名：将所有非空参数字段按 ASCII 升序排序。按键的顺序连接值以生成字符串StringA。
//    //StringA使用商户私钥（ ）通过RSA加密queryString获取签名值sign。
//    public String buildSign(Map<String, Object> params, String key, String signName) {
//        params.values().removeIf(StrUtils::empty);
//        params.remove("sign");
//        String signString = SignatureUtil.sortParamValue(params);
//        Console.log("待签名参数：{}", signString);
//        Console.log("私钥key：{}", key);
//        String sign = RsaUtils.encryptByPrivate(signString, key);
//        Console.log("签名：{}", sign);
//        return sign;
//    }
//
//    // 代收回调验证签名
//
//    @Override
//    public boolean checkSignNotify(Map<String, Object> map, JSONObject jo, String key, String mchKey, String signName, HttpServletRequest request, PayMerchant merchant) {
//        map.values().removeIf(StrUtils::empty);
//        String sign = (String) map.get("platSign");
//        log.info("sign：{}", sign);
//        map.remove("platSign");
//        String srcStr = SignatureUtil.sortParamValue(map);
//        log.info("原始串：{}", srcStr);
//        // 这里是merchant.getPlatPublicKey()是公钥
//        log.info("公钥: {}", merchant.getPlatPublicKey());
//        return RsaUtils.verifySign(srcStr, sign, merchant.getPlatPublicKey());
//    }
//
//
//    @Override
//    protected boolean checkPayoutSignNotify(Map<String, Object> map, JSONObject jo, String mchKey, String signName, HttpServletRequest request, PayMerchant merchant) {
//        map.values().removeIf(StrUtils::empty);
//        String sign = (String) map.get("platSign");
//        log.info("sign：{}", sign);
//        map.remove("platSign");
//        String srcStr = SignatureUtil.sortParamValue(map);
//        log.info("原始串：{}", srcStr);
//        log.info("key: {}", merchant.getPlatPublicKey());
//        // 这里merchant.getPlatPublicKey()是公钥
//        log.info("公钥: {}", merchant.getPlatPublicKey());
//        return RsaUtils.verifySignByPub(srcStr, sign, merchant.getPlatPublicKey());
//    }
//
//    //代收下单 构造参数
//    @Override
//    public Map<String, Object> unifiedOrderBuildParams(UnifiedOrderIO.Params params) {
//        return MapBuilder.<String, Object>create()
//                .put("merchantCode", params.getMchId())//商户编码
//                .put("method", params.getPayType())//支付类型编码
//                .put("orderNum", params.getNo())//商户订单号
//                .put("payMoney", params.getMoney().setScale(2, RoundingMode.UP).toString())
//                .put("productDetail", "clickpay")
//                .put("name", params.getUsername())
//                .put("email", params.getEmail())
//                .put("currency", params.getCountryCurrency())//币种编码
//                .put("notifyUrl", params.getNotifyUrl().trim())//通知地址
//                .put("redirectUrl", params.getReturnUrl())//支付成功跳转地址
//                .put("phone", params.getPhone())
//                .put("dateTime", params.getNow_yyyyMMddHHmmss())
//                .build()
//                ;
//    }
//
//    //代收下单 返回转化
//    @Override
//    public UnifiedOrderIO.Result unifiedOrderReadResult(JSONObject result) {
//        boolean success = "SUCCESS".equals(result.getStr("platRespCode"));
//        return UnifiedOrderIO.Result.builder()
//                .success(success)
//                .errorMsg(result.getStr("platRespMessage"))
//                .payUrl(success ? result.getStr("payData") : null)//支付链接
//                .build();
//    }
//
//    //代收通知 参数转化
//    @Override
//    public NotifyIO.Params notifyReadData(JSONObject data) {
//        String status = data.getStr("code");
//        return NotifyIO.Params.builder()
//                .statusSuccess("00".equals(status))
//                .no(data.getStr("orderNum"))//商户订单号
//                .payNo(data.getStr("platOrderNum"))//三方订单号
//                .amount(data.getStr("payMoney"))//实付金额
//                .build()
//                ;
//    }
//
//    //代收通知 返回
//    @Override
//    public String notifyBuildReturn(Boolean success) {
//        return success ? "SUCCESS" : "FAIL";
//    }
//
//
//    //代付下单 构造参数
//    @Override
//    public Map<String, Object> payoutBuildParams(PayoutIO.Params params) {
//        return MapBuilder.<String, Object>create()
//                .put("merchantCode", params.getMchId())//商户编码
//                .put("orderNum", params.getNo())//商户订单号
//                .put("money", params.getAmount().setScale(2, RoundingMode.DOWN).toString())
//                .put("feeType", params.getPayType())
//                .put("dateTime", params.getNow_yyyyMMddHHmmss())
//                .put("name", params.getBankUsername())
//                .put("number", StrUtils.or(params.getBankAccount(), params.getUpi()))
//                .put("bankLinked", params.getIfsc())
//                .put("bankCode", "IFSC")
//                .put("bankName", LogicUtils.or(params.getBankName(), BANK_NAME))
//                .put("accountEmail", LogicUtils.or(params.getEmail(), MAIL))
//                .put("accountMobile", LogicUtils.or(params.getBankPhone(), PHONE))
//                .put("description", "payout")
//                .put("currency", params.getCountryCurrency())//币种编码
//                .put("notifyUrl", params.getNotifyUrl().trim())//通知地址
//                .build();
//    }
//
//    @Override
//    protected String buildPayoutSignPost(Map<String, Object> createMap, String merKey, String signName) {
//        List<String> paramNameList = new ArrayList<>(createMap.keySet());
//        Collections.sort(paramNameList);  // 排序key
//        StringBuilder stringBuilder = new StringBuilder();
//        for (String key : paramNameList) {
//            stringBuilder.append(createMap.get(key));  // 拼接参数
//        }
//        String keyStr = stringBuilder.toString();  // 得到待加密的字符串
//        System.out.println("keyStr:" + keyStr);
//        String signedStr = "";
//        try {
//            signedStr = RsaUtils.privateEncrypt(keyStr, RsaUtils.getPrivateKey(merKey));  // 私钥加密
//        } catch (Exception e) {
//            log.error(e.getMessage(), e);
//        }
//        return signedStr;
//    }
//
//    //代付下单 返回转化
//    @Override
//    public PayoutIO.Result payoutReadResult(JSONObject result) {
//        boolean success = "SUCCESS".equals(result.getStr("platRespCode"));
//        return PayoutIO.Result.builder()
//                .success(success)
//                .errorMsg(result.getStr("platRespMessage"))
//                .build();
//    }
//
//    //代付通知 参数转化
//    @Override
//    public PayoutNotifyIO.Params payoutNotifyReadData(JSONObject data) {
//        String status = data.getStr("status");
//        //商户订单号
//        //三方订单号
//        //三方订单号
//        return PayoutNotifyIO.Params.builder()
//                .no(data.getStr("orderNum"))//商户订单号
//                .amount(data.getStr("money"))
//                .statusSuccess("2".equals(status))
//                .statusFail(!"2".equals(status))
//                .payNo(data.getStr("platOrderNum"))//三方订单号
//                .message(data.getStr("statusMsg"))//三方订单号
//                .build();
//    }
//
//    //代付通知 返回
//    @Override
//    public String payoutNotifyBuildReturn(Boolean success) {
//        return success ? "success" : "fail";
//    }
//}
